import java.util.Scanner;

public class TestDemo {
    //finally
    /*
        在写程序时，有些特定的代码，不论程序是否发生异常，都需要执行，比如程序中打开的资源：网络连接、数据库
    连接、IO流等，在程序正常或者异常退出时，必须要对资源进进行回收。另外，因为异常会引发程序的跳转，可能
    导致有些语句执行不到，finally就是用来解决这个问题的。
     */
    public static void main1(String[] args) {
        try{
            System.out.println(10 / 10);
        }catch(ArithmeticException e){
            System.out.println("捕获到了算数异常");
        }finally {
            System.out.println("finally,不管是否被抛出了异常，都会被执行了");
        }
        System.out.println("其他业务代码");
    }
    //问题：既然 finally 和 try-catch-finally 后的代码都会执行，那为什么还要有finally呢？
    //示例：
    public static void main2(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        try{
            System.out.println(10 / a);
        }catch(ArithmeticException e){
            System.out.println("捕获到了算数异常");
        }finally {
            scanner.close();//关闭资源
            System.out.println("finally,不管是否被抛出了异常，都会被执行了");
        }//因为抛出了异常，那么scanner不会返回值，所以这个资源不会是空的状态，我们需要用if来判断是否为空，去进行关闭
        System.out.println("其他业务代码");
    }

    public static int func(){
        int a = 10;
        try{
            return a;
        }catch (NullPointerException e){

        }finally {
            return 100;//不建议在finally中当中return这种语句
        }
    }

    public static void main3(String[] args) {
        int ret = func();
        System.out.println(ret);
    }

    //异常的处理流程：
    //如果本方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递
    //如果向上一直传递都没有合适的方法处理异常, 最终就会交给 JVM 处理, 程序就会异常终止(和我们最开始未使用 try
    //catch 时是一样的).
    public static void func2(){
        int a = 0;
        System.out.println(10 / a);
    }

    public static void main(String[] args) {
        //func2();//这就是一典型的异常处理
        try {
            func2();
        }catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("抛出了一个异常！");
        }finally {

        }
    }

    /*
    【异常处理流程总结】
    程序先执行try中的代码
    如果try中的代码出现异常, 就会结束try中的代码, 看和catch中的异常类型是否匹配.
    如果找到匹配的异常类型, 就会执行catch中的代码
    如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
    无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
    如果上层调用者也没有处理的了异常, 就继续向上传递.
    一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.
     */

}
